/**
 * 题目三：自定义一个Temperature类（含double celsius字段），
 * 写方法把celsius转成float fahrenheit（公式：fahrenheit = celsius * 1.8f + 32），测试不同输入值。
 */
public class Temperature {
    private double celsius; // 存储摄氏温度值的字段

    // 构造函数，用于初始化Temperature对象的celsius字段
    public Temperature(double celsius) {
        this.celsius = celsius;
    }

    /**
     * 将摄氏温度转换为华氏温度
     * 使用公式：fahrenheit = celsius * 1.8f + 32
     * @return 转换后的华氏温度值（float类型）
     */
    public float toFahrenheit() {
        return (float)(celsius * 1.8f + 32); // 执行转换计算并返回结果
    }

    /**
     * 使用double精度的1.8进行转换，用于对比精度差异
     * @return 使用double精度计算得到的华氏温度值
     */
    public double toFahrenheitWithDoublePrecision() {
        return celsius * 1.8 + 32; // 使用double精度的1.8
    }

    /**
     * 主方法，用于测试Temperature类的功能
     * @param args 命令行参数（未使用）
     */
    public static void main(String[] args) {
        // 测试用例1：水的冰点（0摄氏度）
        Temperature temp1 = new Temperature(0);
        System.out.println("0 Celsius = " + temp1.toFahrenheit() + " Fahrenheit");

        // 测试用例2：人体正常体温（37摄氏度）
        Temperature temp2 = new Temperature(37);
        System.out.println("37 Celsius = " + temp2.toFahrenheit() + " Fahrenheit");

        // 测试用例3：水的沸点（100摄氏度）
        Temperature temp3 = new Temperature(100);
        System.out.println("100 Celsius = " + temp3.toFahrenheit() + " Fahrenheit");

        // 测试用例4：小数值测试
        Temperature temp4 = new Temperature(0.5);
        System.out.println("0.5 Celsius = " + temp4.toFahrenheit() + " Fahrenheit");

        // 测试用例5：绝对零度
        Temperature temp5 = new Temperature(-273.15);
        System.out.println("-273.15 Celsius = " + temp5.toFahrenheit() + " Fahrenheit");

        System.out.println("\n=== 精度对比测试（1.8f vs 1.8）===");
        System.out.println("摄氏度\t\t1.8f结果\t\t1.8结果\t\t差值");
        System.out.println("========================================================");
        
        // 测试关键数值：8.1和其他容易产生精度误差的值
        double[] testValues = {8.1, 0.1, 0.5, 1.0, 10.1, 25.3, 37.0, 100.0};
        
        for (double value : testValues) {
            Temperature temp = new Temperature(value);
            float resultFloat = temp.toFahrenheit(); // 使用1.8f
            double resultDouble = temp.toFahrenheitWithDoublePrecision(); // 使用1.8
            
            // 计算两种方法的差值
            double difference = Math.abs(resultDouble - resultFloat);
            
            System.out.printf("%-10.6f\t%-10.6f\t%-10.6f\t%-10.6f%n", 
                value, resultFloat, resultDouble, difference);
        }

        // 深入分析8.1这个特定案例
        System.out.println("\n=== 8.1摄氏度的深度精度分析 ===");
        Temperature specialTemp = new Temperature(8.1);
        float floatResult = specialTemp.toFahrenheit();
        double doubleResult = specialTemp.toFahrenheitWithDoublePrecision();
        
        System.out.println("使用1.8f计算过程: 8.1 * 1.8f = " + (8.1f * 1.8f) + " + 32 = " + floatResult);
        System.out.println("使用1.8计算过程: 8.1 * 1.8 = " + (8.1 * 1.8) + " + 32 = " + doubleResult);
        System.out.println("精度差异: " + (doubleResult - floatResult));
        
        // 二进制表示差异分析
        System.out.println("\n二进制表示差异:");
        System.out.println("1.8f的二进制: " + Integer.toBinaryString(Float.floatToIntBits(1.8f)));
        System.out.println("1.8的二进制: " + Long.toBinaryString(Double.doubleToLongBits(1.8)));
    }
}